package ar.edu.utn.frba.disenio.aterrizar.reserva;

import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import ar.edu.utn.frba.disenio.aterrizar.usuario.Usuario;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.Aerolinea;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.Vuelo;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.ReservaNoEncontradaException;
import ar.edu.utn.frba.disenio.aterrizar.reserva.Reserva;

public class ManagerReserva {
	private ArrayList<Reserva> reservas;
	
	public ManagerReserva(){
		reservas = new ArrayList <Reserva>();
	}
	
	public void reservar(Aerolinea aerolinea, Usuario usuario, String codigo){
		
		Reserva reserva;
		try{
			reserva = this.buscar(aerolinea, codigo);
			reserva.agregarUsuario(usuario, this.getFechaActual());
		}
		catch (ReservaNoEncontradaException e){
			Vuelo unVuelo = aerolinea.buscarVueloParticular(codigo, usuario);
			aerolinea.reservar(codigo, usuario);
			reserva = new Reserva(usuario, aerolinea, unVuelo, this.getFechaActual());
			reservas.add(reserva);
		}
	}	
	
	public Reserva buscar(Aerolinea aerolinea, String codigoAsiento){
		
		ArrayList<Reserva> reservas = this.getReservas();
		
		for(Reserva unaReserva : reservas){
			if ((unaReserva.aerolinea.equals(aerolinea)) && (unaReserva.codAsiento.equals(codigoAsiento))){
				return unaReserva;
			}					
		}		 
		throw new ReservaNoEncontradaException();
	}
	
    
    public void borrarExpirados(Aerolinea aerolinea,String codigoAsiento){
    	Reserva reservaEncontrada = this.buscar(aerolinea, codigoAsiento);
    	reservaEncontrada.reservaUsuarios.remove(0);
    	if (!reservaEncontrada.reservaUsuarios.isEmpty()){
    		ReservaUsuario primerReservaUsuario=reservaEncontrada.reservaUsuarios.get(0);
    		primerReservaUsuario.getUsuario().reservar(codigoAsiento, aerolinea, this);
    	}
	}
    
    public void borrarSobreReservas(Aerolinea aerolinea,String codigoAsiento){
    	Reserva reservaEncontrada = this.buscar(aerolinea, codigoAsiento);
    	if (!reservaEncontrada.reservaUsuarios.isEmpty()){
    		ReservaUsuario primerUsuario = reservaEncontrada.reservaUsuarios.get(0);
	    	reservaEncontrada.reservaUsuarios.clear();
	    	reservaEncontrada.reservaUsuarios.add(new ReservaUsuario(primerUsuario.getUsuario(), primerUsuario.getFechaActual()));
    	}
    }
    
	 //Metodo usado para obtener la fecha actual
    //@return Retorna un <b>STRING</b> con la fecha actual formato "dd/MM/yyyy"
    	public String getFechaActual() {
    	Date fechaActual = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");        
        return formato.format(fechaActual);
    } 

    public ArrayList<Reserva> getReservas(){
    	return this.reservas;
    }
    
}
